// #include <stdio.h>
// #include <stdlib.h>
// #include <string.h>
// #include <sys/types.h>
// #include <sys/socket.h>
// #include <netdb.h>
// #include <arpa/inet.h>

// int main(int argc, char *argv[]) {
//     struct addrinfo hints;
//     struct addrinfo *result, *rp;
//     char ipstr[INET6_ADDRSTRLEN];

//     // 配置查询参数
//     memset(&hints, 0, sizeof(struct addrinfo));
//     hints.ai_family = AF_UNSPEC;    // 同时支持 IPv4/IPv6
//     hints.ai_socktype = SOCK_STREAM; // TCP 流套接字
//     hints.ai_flags = AI_CANONNAME;  // 返回规范主机名

//     // 执行地址查询
//     int status = getaddrinfo("www.baidu.com", "http", &hints, &result);
//     if (status != 0) {
//         fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
//         exit(EXIT_FAILURE);
//     }

//     printf("规范名称: %s\n\n", result->ai_canonname ? result->ai_canonname : "N/A");

//     // 遍历所有结果
//     int i = 1;
//     for (rp = result; rp != NULL; rp = rp->ai_next) {
//         void *addr;
//         char *ipver;
//         int port;

//         // 获取IPv4/IPv6地址指针
//         if (rp->ai_family == AF_INET) { // IPv4
//             struct sockaddr_in *ipv4 = (struct sockaddr_in *)rp->ai_addr;
//             addr = &(ipv4->sin_addr);
//             ipver = "IPv4";
//             port = ntohs(((struct sockaddr_in*) rp->ai_addr)->sin_port);
//         } else { // IPv6
//             struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)rp->ai_addr;
//             addr = &(ipv6->sin6_addr);
//             ipver = "IPv6";
//              port = ntohs(((struct sockaddr_in6*) rp->ai_addr)->sin6_port);
//         }

//         // 将二进制地址转为可读字符串
//         inet_ntop(rp->ai_family, addr, ipstr, sizeof(ipstr));
//         printf("地址 %d: %s (%s)\n", i++, ipstr, ipver);
//         printf("主机名: %s\n", rp->ai_canonname ? rp->ai_canonname : "N/A");
//         printf("端口：%d\n\n",port);
//     }

//     freeaddrinfo(result); // 释放内存
//     return 0;
// }


#include <stdio.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/socket.h>

int main(int argc, char **argv) {
    char *ptr, **pptr;
    char str[INET_ADDRSTRLEN];
    struct hostent *hptr;
    struct sockaddr_in saddr;

    ptr = "36.152.44.93"; // 输入IP地址（如 "115.239.211.110"）
    if (!inet_aton(ptr, &saddr.sin_addr)) { // 转换点分十进制为二进制IP
        printf("Invalid IP address\n");
        return 1;
    }

    // 关键：传递二进制IP地址（网络字节序）和地址长度
    hptr = gethostbyaddr((void *)&saddr.sin_addr, sizeof(saddr.sin_addr), AF_INET);
    if (hptr == NULL) {
        printf("Error: %d (h_errno)\n", h_errno); // 错误处理
        return 1;
    }

    printf("Official name: %s\n", hptr->h_name); // 正式主机名
    for (pptr = hptr->h_aliases; *pptr != NULL; pptr++) 
        printf("Alias: %s\n", *pptr); // 别名列表
    for (pptr = hptr->h_addr_list; *pptr != NULL; pptr++) 
        printf("IP: %s\n", inet_ntop(AF_INET, *pptr, str, sizeof(str))); // 解析回IP
    return 0;
}


